package com.vadmin.vadminjava.service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.vadmin.vadminjava.common.HttpUtils;
import com.vadmin.vadminjava.common.MemoryCache;
import com.vadmin.vadminjava.common.WxWorkConfig;
import com.vadmin.vadminjava.db.DBUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.sql.SQLException;

import static com.vadmin.vadminjava.common.TooUtil.timeStamp2Date;

/* ***********************************************************
 *
 * 企业微信的公共类
 *
 * **********************************************************/
@Component
public class WxWorkCommon {
	org.slf4j.Logger logger = LoggerFactory.getLogger(WxWorkCommon.class.getName());

	@Autowired
	MemoryCache memoryCache;

	/**
	 * 获取access_token
	 * 2022-02-18 经测试通过
	 * https://developer.work.weixin.qq.com/document/path/91039#15074
	 * @return
	 */
	public  String getAccessToken(){

		//从缓存中先读取
		String accessToken = "";

		//判断一下，如果没有的话，从远程获取
		if(memoryCache.shortCache7000S().getIfPresent("access_token")==null){
			String corpid = WxWorkConfig.CORP_ID;
			String corpsecret = WxWorkConfig.CORP_SECRET;
			String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret;
			JSONObject data = JSONObject.parseObject(HttpUtils.doGet(url));
			String _accessToken = data.getString("access_token");
			memoryCache.setShortCache7000S("access_token",_accessToken);//设置到缓存中
			accessToken = _accessToken; //赋值给返回的
			//System.out.println("缓存中没有access_token，或者过期了，从远程获取了。");
		}else{
			accessToken = memoryCache.shortCache7000S().getIfPresent("access_token").toString();
			//System.out.println("从缓存中获取到了access_token"+accessToken+"！！！！！！！");
		}
		return accessToken;
	}


	/**
	 * 使用http get读取员工成员详情
	 * @param ExternalUserID
	 * @return
	 */
	public JSONObject getUserDataByHttp(String userid){
		JSONObject map = new JSONObject();
		map.put("resultFlag", false);
		map.put("resultMsg", "操作失败");

		//限制一下
		if(StringUtils.isEmpty(userid)){
			map.put("resultFlag", false);
			map.put("resultMsg", "缺少userID参数");
			return map;
		}

		//获取accessToken
		String accessToken = getAccessToken();
		//请求url
		String url = "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token="+accessToken+"&userid="+userid;
		//请求

		JSONObject data = JSONObject.parseObject(HttpUtils.doGet(url));

		if(!data.isEmpty()){
			map.put("resultFlag", true);
			map.put("resultMsg", "操作成功");
			map.put("data", data);
		}

		return map;
	}

	/**
	 * 获取外部用户的详情数据
	 * @param ExternalUserID 外部用户id？？
	 * @return
	 */
	public JSONObject getExternalUserDataByHttp(String ExternalUserID){

		JSONObject map = new JSONObject();
		map.put("resultFlag", false);
		map.put("resultMsg", "操作失败");

		//限制一下
		if(StringUtils.isEmpty(ExternalUserID)){
			map.put("resultFlag", false);
			map.put("resultMsg", "缺少ExternalUserID参数");
			return map;
		}

		//获取accessToken
		String accessToken = getAccessToken();
		//请求url
		String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token="+accessToken+"&external_userid="+ExternalUserID;
		//请求

		JSONObject data = JSONObject.parseObject(HttpUtils.doGet(url));

		if(!data.isEmpty()){
			map.put("resultFlag", true);
			map.put("resultMsg", "操作成功");
			map.put("data", data);
		}


		return map;
	}


	/**
	 * 创建外部用户数据
	 * 这里为什么参数是一个JSONObject,因为可能2个地方用到这个方法，一个是普通微信登录，一个是添加外部客户时
	 * 添加外部客户时，需要先获取一下客户的详情，所以这方法里面就不重复获取了
	 * @param externalUserData
	 *
	 */
	public void insertExternalUserData(JSONObject externalUserData)  {

		//System.out.println("要写入的外部客户数据："+externalUserData);
		//初始
		DBUtil dbUtil = new DBUtil();

		//>>>>>>>>>>>>>>>>>>>follow_user部分>>>>>>>>>>>>>>>>>>>
		// todo 注意，这个是一个数组，因为可能被多个人添加,但这只取了第一个，第一次被添加，肯定是取第一个
		// 但重复被添加，本方法不会执行，因为不会重复创建客户表数据
		JSONObject follow_user    = JSONObject.parseObject(externalUserData.getJSONArray("follow_user").get(0).toString());//
		//System.out.println("follow_user部分："+follow_user);
		String     createtime     = follow_user.getString("createtime");//创建时间
		String     oper_userid    = follow_user.getString("oper_userid");//发起添加的userid，如果成员主动添加，为成员的userid；如果是客户主动添加，则为客户的外部联系人userid；如果是内部成员共享/管理员分配，则为对应的成员/管理员userid
		String     userid         = follow_user.getString("userid");//添加了此外部联系人的企业成员userid
		String     add_way        = follow_user.getString("add_way");//该成员添加此客户的来源,见文档的客户详情-来源定义
		//手机号处理，这个也是数组，有可能是空的
		String remark_mobiles = "";
		JSONArray _mobile = follow_user.getJSONArray("remark_mobiles");//该成员对此客户备注的手机号码
		if(_mobile.size()>0){
			remark_mobiles = _mobile.get(0).toString();
		}else{
			remark_mobiles = "-";
		}
		//>>>>>>>>>>>>>>>>>>>external_contact部分>>>>>>>>>>>>>>>>>>>
		JSONObject external_contact = externalUserData.getJSONObject("external_contact");
		//System.out.println("external_contact部分："+external_contact);
		String     external_userid  = external_contact.getString("external_userid");//外部用户id
		String     name             = external_contact.getString("name");//名字
		String     gender             = external_contact.getString("gender");//性别
		String     avatar           = external_contact.getString("avatar");//头像
		String     type             = external_contact.getString("type");//外部联系人的类型，1表示该外部联系人是微信用户，2表示该外部联系人是企业微信用户

		try {
			//写入外部客户数据
			String sqlD = "INSERT INTO `wxwork_external_user`(`external_userid`, `name`, `gender`, `avatar`, `type`, `follow_user`, `create_time`, `remark_mobiles`, `oper_userid`, `userid`, `add_way`) " +
					"VALUES ('"+external_userid+"', '"+name+"', '"+gender+"', '"+avatar+"', '"+type+"', '"+follow_user.toJSONString()+"', '"+timeStamp2Date(createtime)+"', '"+remark_mobiles+"', '"+oper_userid+"', '"+userid+"', '"+add_way+"')";
			//System.out.println(sql3);
			dbUtil.insertOrUpdateInfoTONum(sqlD);
		} catch (Exception ex) {
			logger.error("写入外部客户数据出错了{}",ex);
		} finally {
			dbUtil.closeNoErr();
		}
	}
}
